package com.zsc.wxapp.mapper;

import com.zsc.wxapp.entity.User;
import com.zsc.wxapp.entity.dto.ModifyInfoDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface UserMapper {

    /**
     * 根据手机号查找用户
     * @param phone
     * @return User
     */
    @Select("select * from user where phone = #{phone}")
    User selectUserByPhone(String phone);

    /**
     * 根据id查询用户信息
     * @param userId
     * @return User
     */
    @Select("select * from user where user_id = #{id}")
    User selectUserById(Long userId);

    /**
     * 更新数据库中用户上传数据的信息
     * @param photoTimes
     * @param addVipDays
     * @param userId
     * @param nowDate
     */
    @Update("update `user` set photo_times = #{photoTimes}, vip_reward_days = #{addVipDays}, upload_date = #{nowDate} where user_id = #{userId}")
    void updateUserPhotoTimes(Integer photoTimes, Integer addVipDays, Integer userId, LocalDate nowDate);

    /**
     * 统计有多少用户
     * 如果传 0 是统计有多少零售用户
     * 如果传 1 是统计有多少已经上传价签数据的零售用户
     * 如果传 2 是统计今天有多少用户上传数据
     * @param status
     * @return
     */
    Integer getCustomerNum(Integer status);

    /**
     * 根据传输的值来判断更新字段
     * @param update
     * @param userId
     */
    void updateTimes(Integer update, Long userId);

    /**
     * 获取除开管理员的用户信息
     * @return
     */
    List<User> getAllUser();

    /**
     * 重置用户上传次数
     * @param userId 用户id
     */
    @Update("update user set submit_times = 0, photo_times = 0, maintenance_times = 0, print_times = 0 where user_id = #{userId}")
    void resetTimes(Long userId);

    /**
     * 获取所有的终端用户信息
     * @return
     */
    List<User> getAllEndUser(Long userId);

    /**
     * 根据客户专员id获取到负责用户的总数
     * @param userId
     * @return Integer
     */
    Integer getCustomerNumById(Long userId);

    /**
     * 获取已上传的用户数
     * @return
     */
    @Select("select count(0) from user where upload_date is not null;")
    Integer getCollectedCustomerNum();

    /**
     * 更新用户vip天数
     * 1是C端用户自己上传，2是B端用户上传
     * @param custUuid
     */
    void updateVipDay(String custUuid, Integer type);

    /**
     * 添加客户经理
     *
     * @param managerUuid
     * @param mangerName
     * @param mangerPhone
     * @param password
     * @param now
     */
    void addManager(String managerUuid, String mangerName, String mangerPhone, String password, LocalDateTime now);

    /**
     * 获取所有客户经理账号
     * @return
     */
    @Select("select * from user where permission = 3 or permission = 4")
    List<User> getAllManager();

    /**
     * 添加终端用户
     * @param custUuid
     * @param managePersonName
     * @param phone
     * @param password
     * @param custName
     * @param custUuid1
     * @param now
     * @param area
     * @param custTypeName
     * @param managerId
     */
    void addEndUser(String custUuid, String managePersonName, String phone, String password, String custName, String custUuid1, LocalDateTime now, String area, String custTypeName, Long managerId);

    /**
     * 删除用户
     * @param userId
     */
    @Update("update user set is_valid = -1 where user_id = #{userId}")
    void deleteUser(Long userId);

    /**
     * 修改用户状态
     * @param userId
     * @param status
     */
    @Update("update user set is_valid = #{status} where user_id = #{userId}")
    void setStatus(Long userId, Integer status);

    /**
     * 修改用户密码
     * @param userId
     * @param modifyInfoDTO
     */
//    @Update("update user set password = #{password} where user_id = #{userId}")
    void updateUserInfo(Long userId, ModifyInfoDTO modifyInfoDTO);
}